Cinema Slaughter — native desktop source status (15 October 2026)

Protocol 4 party/shared-screen/reconnect source is newer than the distributed test archives.
Native compilation passed; live multi-account/device behavior remains unverified.

Targets: Windows x64, macOS Apple Silicon and Intel, Linux x64. No Electron.
Tauri uses the system WebView; Rust talks directly to Steamworks. The game UI,
local assets, card/VO data and full/demo content filtering remain shared.

BUILD
Install Node 22+, Python 3.9+, Rust 1.94.1 and the platform build prerequisites:
https://v2.tauri.app/start/prerequisites/
Windows: Visual Studio C++ build tools and WebView2 Runtime.
macOS: Xcode command-line tools.
Linux: WebKitGTK 4.1, GTK 3 and application-indicator development packages.

Local test build (Steam must be running when launched):
node tools/build-native.cjs --edition full --steam-dev --output /NEW/output
Use --edition demo for the demo. --debug is an optional faster development build.
Windows uses python on PATH; elsewhere python3. CS_PYTHON overrides the executable.

Shipping candidate, once the real edition App IDs are assigned:
node tools/build-native.cjs --edition full --app-id FULL_APP_ID --output /NEW/full
node tools/build-native.cjs --edition demo --app-id DEMO_APP_ID --output /NEW/demo
Never include a publisher secret, web API key or steam_appid.txt in either depot.
App 480 is rejected unless --steam-dev is explicit. Full/demo/dev identifiers
are distinct, isolating WebView settings and saves. Steam initialization must
match the compiled App ID. Missing Steam produces a connection error, not a
fabricated account. Production launch requests the correct Steam library entry.

The builder embeds and audits the browser payload before compilation. A depot
contains a native executable (.app on macOS), its Steam shared library, payload
manifest, dependency notices and native manifest. It is not an installer.
macOS uses local ad-hoc signing only; Developer ID signing/notarization and
Windows distribution signing are separate release work. Steam distributes the
portable depot. Linux still depends on compatible system WebKitGTK libraries;
Steam Runtime compatibility has NOT been certified. Windows WebView2 installation
must be provided/verified through prerequisites. A manual CI workflow builds
both editions on all target architectures; merely adding it is not a test run.

CURRENT NATIVE SDK BOUNDARY
- Persona identity, transient Web API tickets and cancellation.
- Tagged, edition-filtered Steam lobby discovery; create/join/leave; eight seats;
  persona names and member readiness; detection of Steam changing lobby owner.
- Sequential lobby operations, bounded waits, late-success cleanup. No arbitrary
  SDK calls, files or shell access are exposed to the page. Main window permits
  only local navigation and a restrictive content-security policy.
- Invite overlay endpoint checks lobby membership and overlay availability.
  Actual overlay display, invitation acceptance and controller overlay behavior
  remain unverified. No automatic invitation is sent by a test or startup.

NATIVE MULTIPLAYER CANDIDATE
The production Create/Join/Browse screens now use Steam lobbies in the native
build. The host runs the existing rules engine; authenticated Steam Networking
Messages carry private hands, player actions and public match snapshots. Guests
reuse the production game components. Tutorial, screening, director and result
progression follow the host. Ready/preload acknowledgements precede launch.
Private rooms are Steam FriendsOnly, unlisted in public browsing. Use the
in-game Steam friends invite flow for native friends. Four-digit codes and
QR/share links identify phone access; do not present long Steam IDs as phone codes.
Use the same build and edition on every computer. Add bots manually if fewer
than three people join. No local server, localhost URL or publisher key is needed
for this native-to-native path. The development App ID is compiled as 480.

A lost guest heartbeat pauses the match while Steam membership remains; it can
resume when packets return. A departed non-host seat does not terminate everyone
else, and REJOIN GAME can now reclaim it. Original host loss pauses the match
for two minutes; RESUME GAME restores the same host's saved engine and transport.
Only the original host resumes; there is no substitute-host engine migration.
Explicit End/Leave closes the game. See ../RECONNECT-AUDIT.txt for limits.

Separate native party lobbies now persist across normal match travel, with typed
party/game invitation routing and <=4-person atomic admission. Owner-backed phone
households can travel with their sponsor to public/private hosts through the
configured phone gateway. Party leadership does not grant access to private hands.
Host and visiting households can pair a private owner controller and make their
desktop a shared screen. Phones currently supply quiet controls, not a complete
remote show/audio experience. Owner-controller capabilities restore with the
match checkpoint; party-management state across app restart is separate.
Real invitation delivery, cold launch, mixed party travel and actual
phone/network operation remain unverified, as do achievements/cloud integration.
This candidate has local transport/rules tests and browser guest-screen checks;
these do not prove real multi-computer connectivity. Run the first match with
one host, one friend and one manually added bot before expanding the group.
The ordinary browser build continues to use its existing local room service.

Spacewar checks (development build only for lobby creation):
<executable> --check-steam
<executable> --check-lobby
The latter creates ONE PRIVATE room, checks its owner/member metadata, sets
ready, then leaves. It never creates a public test room or sends invitations.
Ticket bytes are never printed or saved. Steam's own SDK may log account IDs.

DEMO + FULL FRIENDS
Steam does not support matchmaking between separate full and demo App IDs:
https://partner.steamgames.com/doc/store/application/demos
Keep the private browser/phone guest path for cross-edition friends. The updated
play model also allows an owning member to bring free phone guests into public
rooms as part of a <=4-person online party. This grants no independent ownership.
App 480 is not proof of real-product ownership. Limited-demo work is deferred
until the full multiplayer experience is validated.

LICENSES / DISTRIBUTION
The package copies dependency license notices supplied by Cargo. Game assets
retain their existing embedded credits/licenses. Steamworks SDK redistribution
must comply with the developer's Steamworks agreement; bundled bindings do not
replace that agreement. The temporary application icon is the existing Bubble
Skull studio mark, padded to a square; final store icons remain separate artwork.
